#define quickread
#ifdef quickread
#include <cstdio> 
template <typename T>
inline void read(T& x)
{
    int c=getchar(), f=1; x=0;
    while(c<'0'||'9'<c) {if(c=='-') f=-1; c=getchar();}
    while('0'<=c&&c<='9') 
        x=(x<<3)+(x<<1)+c-'0', c=getchar();
    x*=f;
}
template <typename T>
inline void quickwrite(T x)
{
    if(x<0) putchar('-'), x*=-1;
    if(x>=10) quickwrite(x/10);
    putchar(x%10+'0');
}
#else 
#include <iostream>
#endif
#include <vector>
#include <cstring>
using namespace std;
#define DEBUG
#define int long long
const int N=1e5+10, INF=0x3f3f3f3f3f3f3f3f;
int n, m, k; //最多同时记录事件
int p[N]; //可以使用t[v]唤醒u的孩子v
int r[N]; //直接唤醒
int t[N];
int x[N]; //第i道题目使用x[i]事件

bool need[N]; //节点i是否需要
vector<int> roots; //记录所有根节点
int dp[N][15]; 
//dp[u][k]：第u个节点，最多使用k个空间，使u为根的子树除自己外所有被需要的节点被完成的最少时间
vector<int> son[N];
int ans;

void init()
{
    for(int i=0; i<N; i++) son[i].clear();
    roots.clear();
    memset(p, 0, sizeof p);
    memset(r, 0, sizeof r);
    memset(t, 0, sizeof t);
    memset(x, 0, sizeof x);
    memset(need, 0, sizeof need);
    memset(dp, 0, sizeof dp);

    read(n), read(m), read(k);
    for(int i=1; i<=n; i++) read(p[i]), son[p[i]].push_back(i);
    for(int i=1; i<=n; i++) read(r[i]);
    for(int i=1; i<=n; i++) read(t[i]);
    for(int i=1; i<=m; i++) read(x[i]), need[x[i]]=1;
    for(int i=1; i<=n; i++)
        if(p[i]==0) roots.push_back(i); 

    ans=0;       
}

void dfs(int u, int fa)
{
    int maxx[15]; //转移dp[u][i]时，最多能省多少时间
    memset(maxx, 0, sizeof maxx);
    if(need[u]) dp[u][0]=INF; //当前节点一定要使用 回忆或联想

    for(int v:son[u])
    {
        dfs(v, u);

        if(!need[u]) //当前节点不用，但是子节点要用
            dp[u][0]+=min(dp[v][k]+r[v], dp[v][0]); //不回忆u节点
        dp[u][1]+=min(dp[v][k]+r[v], dp[v][0]);  //回忆u节点

        for(int j=2; j<=k; j++)
        {
                      // !u          u&&v               !u&&v
            int x=min(dp[v][0], min(dp[v][j-1]+t[v], dp[v][k]+r[v]));
            dp[u][j]+=x;
            maxx[j]=max(maxx[j], x-(dp[v][j]+t[v]));
        }
    }

    for(int j=2; j<=k; j++)
        dp[u][j]-=maxx[j];
}

void solve()
{
    init();
    for(int i:roots)
        dfs(i, 0), ans+=min(dp[i][k]+r[i], dp[i][0]);
    quickwrite(ans); puts("");
}

// #undef DEBUG
signed main()
{
    #ifdef DEBUG
        freopen("../in.txt", "r", stdin);
        freopen("../out.txt", "w", stdout);
    #endif
    #ifndef quickread
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    #endif

    int T=1; scanf("%d", &T);
    while(T--) 
    {
        solve();
    }
    return 0;
}
